//=============================================================================
// DEFINICIO DE LA CLASSE 'DIRECTORYMANAGER'
//=============================================================================
#ifndef BUFFERMANAGER_HPP
#define	BUFFERMANAGER_HPP

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "utils.hpp"
using namespace std;


class bufferManager
{
	public:
		bufferManager(char* pPath);
			//PRE: la ruta pPath ha de ser vàlida.
			//POST: aquesta instància està associada al fitxer indicat.
		char* query(int pPag);
			//PRE: pPag < número de pàgines del disc.
			//POST: SI pàgina està al pool = retornem el punter a pàgina.
			//SI pàgina NO està al pool Y existeix buffer lliure = la bufferitzem i retornem punter a pàgina.
			//SI pàgina NO està al pool Y NO existeix buffer lliure = la fiquem a pendents.
		void update(int pPag);
			//PRE: cap precondició.
			//POST:
		void unpin(int pPag);
			//PRE: cap precondició.
			//POST: si troba la pàgina, resta 1 al valor PIN.
			//en cas contrari, no fa res.
		void stat(int pFrm);
			//PRE: 0 <= pFrm < 32
			//POST:
		void pendent();
			//PRE: cap precondició.
			//POST: s'executen les ordres pendents.
		~bufferManager();
			//PRE: cap precondició.
			//POST: executa la funció empty (buidar) quan es destrueix l'objecte.

	private:
		//Estructura del objecte buffer.
		struct buffer{ char* data; int npag; int pin; bool dirty;};
		//Pool de 32 frames.
		buffer _pool[32];
		//Punter a fitxer.
		FILE* _file;

		int find();
			//PRE: cap precondició.
			//POST: si hi ha cap buffer lliure, retorna la posició (del primer)
			//dins del pool, en cas contrari retorna "-1".
		int find(int pPag);
			//PRE: cap precondició.
			//POST: retorna la posició del buffer-pool on es troba la pàgina.
		void save(int pFrm);
			//PRE: 0 <= pBuf < mida de pool.
			//POST: les dades del buffer son guardades a disc.
		void remove(int pFrm);
			//PRE: 0 <= pBuf < mida de pool.
			//POST: elimina el contingut d'un buffer i restableix els paràmetres.
		void empty();
			//PRE: cap precondició.
			//POST: desa les dades de tots els buffers i les elimina.
};

#endif
